package modelo;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public abstract class MovimientoDirigido implements Movimiento {

	private VerificadorDeCoordenadas verificador = new VerificadorDeCoordenadas();


	public abstract Movimiento invertir();
	
	protected abstract Coordenada moverCoordenada(Coordenada coordenadaAMover);

	private void cambiarCoordenadas(Iterable<Coordenada> coordenadasViejas, List<Coordenada> coordenadasNuevas)
	{	
		Coordenada coordenadaNueva;
		Iterator<Coordenada> coordsNuevas = coordenadasNuevas.iterator();
	    
		for (Coordenada coord : coordenadasViejas)
		{	
			coordenadaNueva = coordsNuevas.next();
	    	coord.setCoordenadas(coordenadaNueva.getX(), coordenadaNueva.getY());
	    	
	    	
	    }
	}
	
	
	public boolean mover(Iterable<Coordenada> coordenadas)
	{
		boolean pudeMoverlo = true;
		List<Coordenada> coordenadasNuevas = new LinkedList<Coordenada>();
		Coordenada coordMovida; 
		
		for (Coordenada coord : coordenadas)
		{
			coordMovida = this.moverCoordenada(coord);
			coordenadasNuevas.add(coordMovida);
			if ( !verificador.verificarCoordenada(coordMovida) )
				pudeMoverlo=false;
		}
		
		if (pudeMoverlo)
			this.cambiarCoordenadas(coordenadas,coordenadasNuevas);
		
			
		return pudeMoverlo;
		
	}


	
}
